OS. C++でのOpenSTAADプログラムの記述
この例では、C++でOpenSTAADアプリケーションを記述するために必要ないくつかの概念を紹介します。
Visual Studio 2019のC++プロジェクトの例は、こちらからダウンロードできます。
OS. C++でのOpenSTAADの開始
-
マニフェストファイルを作成してC++プロジェクトに追加します。
- 新しいファイルを作成し、ファイル拡張子を.manifestにして任意の場所に保存します。
- Visual Studio内からプロジェクトを右クリックし、ポップアップメニューから の順に選択します。
- マニフェストファイルを参照して選択します。
-
マニフェストファイルを開き、次の内容を追加します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> <comInterfaceExternalProxyStub name="IOSMemberSteelDgnParams" iid="{F40BDCDA-B3DE-495C-B84F-790F4456137F}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOpenSTAADUI" iid="{3F5B8055-31C6-446E-8BED-FEE43E09D4CC}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSGeometryUI" iid="{C052FED9-A2D6-42E3-A271-2C6FB8461711}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IStaadProWindow" iid="{9EF2FF8C-E574-4A04-9462-2E4500C8EADB}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSViewUI" iid="{87B1975B-6031-487E-A0F9-FB8F69FA24E6}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSOutputUI" iid="{824F1FC0-DC86-4CC4-A4C6-83C77D7B0496}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSPropertyUI" iid="{F919EF7D-E1DD-48CB-B3C3-B3CAE9E3B5AB}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSLoadUI" iid="{DAA37D16-821F-4137-88EB-DA4EB7650E90}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSTableUI" iid="{CF1A7B89-A007-4844-A098-CBABAEBEF304}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSSupportUI" iid="{B076EC62-9A33-4E1C-B38C-3E45090B8531}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSCommandsUI" iid="{6B994A7C-122C-4828-B42B-1B0CADF91F9D}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> <comInterfaceExternalProxyStub name="IOSDesignUI" iid="{ED218322-40EE-411C-8552-209DB2C4F32B}" tlbid="{EDA9FA7F-EFC9-4264-9513-39CF6E72604D}" proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub> </assembly>
- 「#import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids」と入力してStaadPro.dllをインポートし、<Enter>キーを押します。
- 「namespace OSApp = OpenSTAADUI;」と入力して名前空間を設定し、<Enter>キーを押します。 この名前空間には、COM相互運用とプラットフォーム呼び出しのサービスをサポートするさまざまなメンバーが用意されています。
- int main()の内側にカーソルを置きます。
-
次の行を追加します。
OSApp::IOpenSTAADUIPtr OSAppPtr; CoInitialize(NULL); HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD)); if (hr != S_OK) { printf("Unable to connect to STAAD.Pro application!\n"); return 1; } hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
これにより、OpenSTAADが開始され、プログラムの現在のSTAAD.Proモデルに接続されます。CreateInstanceは初期化されていないオブジェクトを作成し、GetActiveObjectはOLEに登録されている実行中のオブジェクトへのポインタを取得します。
この時点で、プログラムは次のようになります。
#import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids
using namespace OpenSTAADUI;
using namespace std;
namespace OSApp = OpenSTAADUI;
int main()
{
OSApp::IOpenSTAADUIPtr OSAppPtr;
try
{
CoInitialize(NULL);
HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to STAAD.Pro application!\n");
return 1;
}
hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to an active instance of STAAD.Pro application!\n");
return 1;
}
}
catch (_com_error& e)
{
_bstr_t bstrDescription = e.Description();
printf("COM Error! %s\n", bstrDescription);
}
}
OS. Geometryメソッドの使用
- main()の先頭にある「OSApp::IOpenSTAADUIPtr OSAppPtr;」の後の新しい行に「OSApp::IOSGeometryUIPtr OSGeomPtr;」と入力し、<Enter>キーを押します。
- main()の終了を示す右中括弧("}")のすぐ内側にカーソルを置き、<Enter>キーを押します。
-
「OSGeomPtr = OSAppPtr->GetGeometry();」と入力し、<Enter>キーを押します。
これにより、ジオメトリ変数がOpenSTAADのGeometryグループのメソッドとして定義されます。
-
「int nNodes = OSGeomPtr->GetNodeCount();」と入力し、<Enter>キーを押します。
これにより、OpenSTAADメソッドGetNodeCount()を使用して、アクティブなSTAAD.Proモデル内のノードの数が指定した変数に返されるようになります。
-
「int nMembers = OSGeomPtr->GetMemberCount();」と入力し、<Enter>キーを押します。
同様に、OpenSTAADメソッドGetMemberCount()を使用して、アクティブなSTAAD.Proモデル内のメンバーの数が指定した変数に返されるようになります。
この時点で、プログラムは次のようになります。
#include "pch.h"
#include <iostream>
#import "C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\STAAD\StaadPro.dll" named_guids
using namespace OpenSTAADUI;
using namespace std;
namespace OSApp = OpenSTAADUI;
int main()
{
OSApp::IOpenSTAADUIPtr OSAppPtr;
OSApp::IOSGeometryUIPtr OSGeomPtr;
try
{
CoInitialize(NULL);
HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to STAAD.Pro application!\n");
return 1;
}
hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to an active instance of STAAD.Pro application!\n");
return 1;
}
OSGeomPtr = OSAppPtr->GetGeometry();
int nNodes = OSGeomPtr->GetNodeCount();
int nMembers = OSGeomPtr->GetMemberCount();
}
catch (_com_error& e)
{
_bstr_t bstrDescription = e.Description();
printf("COM Error! %s\n", bstrDescription);
}
}
OS. OpenSTAAD出力の生成
-
「printf("No. of Nodes: %d\n", nNodes);」と入力し、<Enter>キーを押します。
ここでは、printfを使用して、フォーマットされたデータを標準出力に出力しています。ノードの数が読み取り可能な形式でコンソールに出力されます。
-
「printf("No. of Members: %d\n", nMembers);」と入力します。
同様に、ここでは、文字列に変換されたbeamCountの値をテキストと連結し、その結果を端末に表示しています。
最終的なプログラムは次のようになります。
#include "pch.h"
#include <iostream>
#import " C:\Program Files\Bentley\Engineering\STAAD.Pro 2023\ STAAD\StaadPro.dll" named_guids
using namespace OpenSTAADUI;
using namespace std;
namespace OSApp = OpenSTAADUI;
int main()
{
OSApp::IOpenSTAADUIPtr OSAppPtr;
OSApp::IOSGeometryUIPtr OSGeomPtr;
try
{
CoInitialize(NULL);
HRESULT hr = OSAppPtr.CreateInstance(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to STAAD.Pro application!\n");
return 1;
}
hr = OSAppPtr.GetActiveObject(__uuidof(OSApp::OpenSTAAD));
if (hr != S_OK)
{
printf("Unable to connect to an active instance of STAAD.Pro application!\n");
return 1;
}
OSGeomPtr = OSAppPtr->GetGeometry();
int nNodes = OSGeomPtr->GetNodeCount();
int nMembers = OSGeomPtr->GetMemberCount();
printf("No. of Nodes: %d\n", nNodes);
printf("No. of Members: %d\n", nMembers);
}
catch (_com_error& e)
{
_bstr_t bstrDescription = e.Description();
printf("COM Error! %s\n", bstrDescription);
}
}